package com.soft.mainsite.common.utils;

import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.io.FileUtils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

/**
 * 图片的处理工具类.
 * <p>
 * 可实现对图片的压缩、放大、旋转、裁剪、水印等功能
 *
 * @author liupengtao
 * @date 2019/9/0
 */
public class ImageUtil {

    /**
     * 默认生成图片格式
     */
    private final static String DEFAULT_IMG_TYPE = "jpg";

    /**
     * 图片按比例压缩
     *
     * @param srcPath  原图片路径
     * @param descPath 目标图片路径
     * @param maxSize  最大大小（KB 为单位）
     * @throws IOException 抛出异常
     */
    public static void compressScale(String srcPath, String descPath, long maxSize) throws IOException {
        File src = new File(srcPath);

        //如果源文件没超过最大大小，则直接复制
        double quality = (maxSize * 1024 * 1.0) / src.length();
        if (quality >= 1) {
            FileUtils.copyFile(new File(srcPath), new File(descPath));
            return;
        }
        //超过的则进行压缩
        Thumbnails.of(src)
                .scale(1f)
                .outputFormat(DEFAULT_IMG_TYPE)
                .outputQuality(quality)
                .toFile(descPath);
    }

    /**
     * 图片按比例压缩
     *
     * @param srcData 原图片字节数组
     * @param maxSize 最大大小（KB 为单位）
     * @throws IOException 抛出异常
     */
    public static byte[] compressScale(byte[] srcData, long maxSize) throws IOException {
        if (srcData == null || srcData.length == 0) {
            return null;
        }
        //如果源文件没超过最大大小，则返回
        double quality = (maxSize * 1024 * 1.0) / srcData.length;
        if (quality >= 1) {
            return srcData;
        }

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(srcData.length);
        //超过的则进行压缩
        Thumbnails.of(new ByteArrayInputStream(srcData))
                .scale(1f)
                .outputFormat(DEFAULT_IMG_TYPE)
                .outputQuality(quality)
                .toOutputStream(outputStream);
        return outputStream.toByteArray();
    }

}
